package com.erp.erp_servers.Billing;

import com.erp.erp_entitys.Billing.entity.BillingEntity;
import com.erp.erp_entitys.Billing.req.*;
import com.erp.erp_entitys.Billing.vo.*;
import com.erp.erp_entitys.Cost.vo.NameAndCodeVO;
import com.erp.erp_entitys.Cost.vo.QueryImportContractVO;
import com.erp.utils.R;
import com.github.pagehelper.PageInfo;

import java.util.List;

/**
 * @author zjk
 * @version 1.0
 * @description
 * @date 2021/1/16/016 22:59
 */
public interface BillingService {
    /**
     * 添加开票主信息
     * @param record
     * @return
     */
    Integer insertBillingEntity(BillingEntity billingEntity);
    /**
     * 修改开票主信息
     * @param record
     * @return
     */
    Integer updateBillingEntityByCode(BillingEntity billingEntity);

    /**
     * 根据开票编号查询开票信息
     * @param code
     * @return
     */
    BillingEntity selectBillingByCode(String code);
    /**
     * 返回可用编号,,,添加时进行效验，验证不通过更改后三位并随机三位数
     * @return 可以使用的编号
     */
    String selectCodeByCode();

    /**
     * 根据条件查询报关信息
     * 在代码里处理未开票数量=产品总数量-开票数量
     * @param req
     * @return
     */
    List<QueryBillDeclareVO> selectBillDeclareByPage(QueryBillDeclareReq req);
    /**
     * 根据条件查询报关信息
     * @param req
     * @return
     */
    PageInfo<QueryBillDeclareVO2> selectBillDeclare2ByPage(QueryBillDeclareReq req);
    /**
     * 根据报关主表id查询报关明细信息
     * @param declareId 报关主表id
     * @return
     */
    List<QueryBillDeclareDetailVO> selectBillDeclareProductByDeclareId(Integer declareId,String manufacturerName);
    /**
     * 根据报关主表id查询报关发票号
     * @param declareId 报关主表id
     * @return
     */
    String selectBillDeclareProductCodeByDeclareId(Integer declareId);
    /**
     * 根据采购主表ID查询采购产品信息
     * @param purchaseId
     * @return
     */
    List<QueryPurchaseProductVO> selectPurchaseProductByPurchaseId(Integer purchaseId);
    /**
     * 根据外销主表ID查询外销产品信息
     * @param exportId
     * @return
     */
    List<QueryExportProductVO> selectExportProductByPurchaseId(Integer exportId);

    /**
     * 根据条件查询出已开票数量
     * @param manufacturerName 厂商名称
     * @param invoiceCode 报关发票号
     * @param stockNo 采购单号
     * @param productCode 产品编码
     * @param specCode 规格编码
     * @return
     */
    Integer selectInvoicedQuantity(String manufacturerName,String invoiceCode,String stockNo,String  productCode,String  specCode);
    /**
     * 查询所有供应商
     * @return
     */
    List<CompanyVO> findAllCustomer2();
    /**
     * 查询所有签约公司(开票抬头)
     * @return
     */
    List<CompanyVO> findAllCompany();
    /**
     * 根据签约公司编号查询银行名称集合
     * @return
     */
    List<String> getBankName(String code);

    /**
     * 根据条件查询开票信息集合
     * @param req
     * @return
     */
    PageInfo<QueryBillingVO> findBillingList(QueryBillingReq req);
    /**
     * 获取当前月开票信息集合
     * @param req
     * @return
     */
    List<QueryBillingVO> findBillingListByMouth(QueryBillingReq req);
    /**
     * 修改开票状态为无效
     * @param costIds
     * @return
     */
    Integer updateBillingValidById(Integer[] costIds);
    /**
     * 更新开票状态
     * @param id 开票id
     * @param status    开票状态
     * @return
     */
    R updateBillingStatusById(Integer id,Integer status);
    /**
     * 根据id查询开票实体
     * @param id
     * @return
     */
    BillingEntity selectById(Integer id);

    /**
     * 开票统计(供应商票，客户票)
     * @param req
     * @return
     */
    List<billingStatistics1VO> billingStatistics1List(billingStatistics1Req req);
    /**
     * 采购开票统计-分页
     * @param req
     * @return
     */
    List<BillingPurchaseStatisticsRes> billingPurchaseStatisticsList(BillingPurchaseStatisticsReq req);

    /**
     * 根据签约公司获取银行名称-开票用，
     * @param companyCode
     * @return
     */
    String getBankNameByCompanyCode(String companyCode);


    /**
     * 获取外销合同-单据得价格术语默认国内贸易
     * @param req
     * @return
     */
    List<QueryImportContractVO> getExportContentList(QueryImportExportContractReq req);

    /**
     * 获取价格术语，只包含国内的--开票用
     * @return
     */
    List<NameAndCodeVO> getPriceTerms();

    /**
     * 开票-导入采购合同
     * @param req
     * @return
     */
    List<QueryPurchaseContractVO> getPurchaseContractList(QueryPurchaseContractReq req);

    /**
     * 开票导入出运明细
     * 获取出运明细产品和配件信息
     */
    List<QueryImportCarrDetailProductRes> findCarryDetailProductList(QueryImportCarrDetailProductReq req);
    /**
     * 根据条件获取出运明细产品已开票数量
     * @param sourceType 1供应商 2客户
     * @param code 出运明细发票号
     * @param contractCode 外销合同号
     * @param productCode 产品编码
     * @param specNo 规格编码
     * @return
     */
    Integer findCarryDetailProductQuantity(Integer sourceType,String code, String contractCode, String productCode, String specNo);

}
